package com.jzoffer;

import java.util.ArrayList;

public class PrintoutMatrix {
    public static void main(String[] args) {
        int [][] matrix ={{1,2,3,4},{12,13,14,5},{11,16,15,6},{10,9,8,7}};
        ArrayList<Integer> integers = printMatrix(matrix);
        System.out.println(integers);

    }

    public static ArrayList<Integer> printMatrix(int [][] matrix){
        ArrayList<Integer> res = new ArrayList<>();
        if(matrix == null ){
            return res;
        }
        int row1 = 0;
        int row2= matrix.length - 1;
        int col1 = 0;
        int col2 = matrix[0].length - 1;

        while (row1 <= row2 && col1 <= col2){

            // 顺时针左
            for(int i = col1;i <= col2;i++){
                res.add(matrix[row1][i]);
            }
            // 顺时针右
            for (int i = row1 + 1;i <= row2;i++){
                res.add(matrix[i][col2]);
            }
            // 顺时针下
            if(row1 != row2) {
                for (int i = col2 - 1; i >= col1; i--) {
                    res.add(matrix[row2][i]);
                }
            }
            // 顺时针左
            if(col1 != col2) {
                for (int i = row2 - 1; i > row1; i--) {
                    res.add(matrix[i][col1]);
                }
            }

            // 四个指标做改动
            col1++;
            col2--;
            row1++;
            row2--;

        }
        return res;
    }

    public static ArrayList<Integer> printMatrix2(int [][] matrix){
        ArrayList<Integer> res = new ArrayList<>();
        if(matrix == null ){
            return res;
        }
        int row1 = 0;
        int row2= matrix.length - 1;
        int col1 = 0;
        int col2 = matrix.length - 1;

        while (row1 <= row2 && col1 <= col2){

            // 顺时针左
            for(int i = col1;i <= col2;i++){
                res.add(matrix[row1][i]);
            }
            // 顺时针右
            for (int i = row1 + 1;i <= row2;i++){
                res.add(matrix[i][col2]);
            }
            // 顺时针下
            for(int i = col2 - 1;i >= col1;i--){
                res.add(matrix[row2][i]);
            }
            // 顺时针左
            for(int i = row2 - 1;i > row1;i--){
                res.add(matrix[i][col1]);
            }

            // 四个指标做改动
            col1++;
            col2--;
            row1++;
            row2--;

        }
        return res;
    }
}
